<?php

declare( strict_types = 1 );

namespace App\Common\Model\Base\Visitors;

use Hyperf\Database\Commands\Ast as nameAst;
use Hyperf\Utils\Str;

/**
 * 主要将json映射为array类型
 * @package App\Common\Model\Base\Visitors
 */
class ModelUpdateVisitor extends nameAst\ModelUpdateVisitor {

	protected function formatDatabaseType( string $type ):?string {
		switch( $type ){
			case 'tinyint':
			case 'smallint':
			case 'mediumint':
			case 'int':
			case 'bigint':
				return 'integer';
			case 'bool':
			case 'boolean':
				return 'boolean';
			case 'json':
				return 'json';
			default:
				return null;
		}
	}

	protected function formatPropertyType( string $type, ?string $cast ):?string {
		if( ! isset( $cast ) ){
			$cast = $this->formatDatabaseType( $type ) ?? 'string';
		}

		switch( $cast ){
			case 'integer':
				return 'int';
			case 'date':
			case 'datetime':
				return '\Carbon\Carbon';
			case 'json':
				return 'array';
		}

		if( Str::startsWith( $cast, 'decimal' ) ){
			// 如果 cast 为 decimal，则 @property 改为 string
			return 'string';
		}

		return $cast;
	}
}
